/* -------------------------------------------------------------------------
 *  This file is part of the Cantian project.
 * Copyright (c) 2024 Huawei Technologies Co.,Ltd.
 *
 * Cantian is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *          http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 * -------------------------------------------------------------------------
 *
 * var_cmp.c
 *
 *
 * IDENTIFICATION
 * src/common/variant/var_cmp.c
 *
 * -------------------------------------------------------------------------
 */
#include "var_cmp.h"
#include "var_opr.h"
#include "var_defs.h"

#define __CMP_TYPE_DEF(lt, rt, rst, st, compat) \
    [CT_TYPE_I((lt))][CT_TYPE_I((rt))] = {.cmp_type = (rst), .same_type = (st), .compatible = (compat)}

cmp_rule_t g_cmp_rules[VAR_TYPE_ARRAY_SIZE][VAR_TYPE_ARRAY_SIZE] = {
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_UINT32,  CT_TYPE_UINT32, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_INTEGER,  CT_TYPE_BIGINT, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_BIGINT,   CT_TYPE_BIGINT, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_REAL,     CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_NUMBER,   CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_NUMBER2,   CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_DECIMAL,  CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_CHAR,     CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_VARCHAR,  CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_STRING,   CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_BOOLEAN,  CT_TYPE_INTEGER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_BINARY,     CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_UINT32, CT_TYPE_VARBINARY,  CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_UINT32,   CT_TYPE_BIGINT, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_INTEGER,  CT_TYPE_INTEGER, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_BIGINT,   CT_TYPE_BIGINT, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_REAL,     CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_NUMBER,   CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_NUMBER2,   CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_DECIMAL,  CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_CHAR,     CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_VARCHAR,  CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_STRING,   CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_BOOLEAN,  CT_TYPE_INTEGER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_BINARY,     CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTEGER, CT_TYPE_VARBINARY,  CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_UINT32, CT_TYPE_BIGINT, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_INTEGER, CT_TYPE_BIGINT, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_BIGINT, CT_TYPE_BIGINT, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_REAL, CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_NUMBER, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_NUMBER2, CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_DECIMAL, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_CHAR, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_VARCHAR, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_STRING, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_BOOLEAN, CT_TYPE_BIGINT, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_BINARY, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BIGINT, CT_TYPE_VARBINARY, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_UINT32, CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_INTEGER, CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_BIGINT, CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_REAL, CT_TYPE_REAL, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_NUMBER, CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_NUMBER2, CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_DECIMAL, CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_CHAR, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_VARCHAR, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_STRING, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_BINARY, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_REAL, CT_TYPE_VARBINARY, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_UINT32, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_INTEGER, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_BIGINT, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_REAL, CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_NUMBER, CT_TYPE_NUMBER, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_NUMBER2, CT_TYPE_NUMBER2, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_DECIMAL, CT_TYPE_NUMBER, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_CHAR, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_VARCHAR, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_STRING, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_BINARY, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER, CT_TYPE_VARBINARY, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_UINT32, CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_INTEGER, CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_BIGINT, CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_REAL, CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_NUMBER, CT_TYPE_NUMBER2, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_NUMBER2, CT_TYPE_NUMBER2, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_DECIMAL, CT_TYPE_NUMBER2, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_CHAR, CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_VARCHAR, CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_STRING, CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_BINARY, CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_NUMBER2, CT_TYPE_VARBINARY, CT_TYPE_NUMBER2, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_UINT32, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_INTEGER, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_BIGINT, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_REAL, CT_TYPE_REAL, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_NUMBER, CT_TYPE_NUMBER, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_NUMBER2, CT_TYPE_NUMBER2, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_DECIMAL, CT_TYPE_NUMBER, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_CHAR, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_VARCHAR, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_STRING, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_BINARY, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DECIMAL, CT_TYPE_VARBINARY, CT_TYPE_NUMBER, CT_FALSE, CT_TRUE),

    // BINARY not support bool yet
    __CMP_TYPE_DEF(CT_TYPE_BOOLEAN, CT_TYPE_UINT32, CT_TYPE_UINT32, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_BOOLEAN, CT_TYPE_INTEGER, CT_TYPE_INTEGER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_BOOLEAN, CT_TYPE_BIGINT, CT_TYPE_BIGINT, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_BOOLEAN, CT_TYPE_CHAR, CT_TYPE_BOOLEAN, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BOOLEAN, CT_TYPE_VARCHAR, CT_TYPE_BOOLEAN, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BOOLEAN, CT_TYPE_STRING, CT_TYPE_BOOLEAN, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BOOLEAN, CT_TYPE_BOOLEAN, CT_TYPE_BOOLEAN, CT_TRUE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_UINT32, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_INTEGER, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_BIGINT, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_REAL, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_NUMBER, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_NUMBER2, CT_TYPE_NUMBER2, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_DECIMAL, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_CHAR, CT_TYPE_CHAR, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_VARCHAR, CT_TYPE_STRING, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_STRING, CT_TYPE_STRING, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_BINARY, CT_TYPE_BINARY, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_VARBINARY, CT_TYPE_VARBINARY, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_RAW, CT_TYPE_STRING, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_DATE, CT_TYPE_DATE, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_BOOLEAN, CT_TYPE_BOOLEAN, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_INTERVAL_YM, CT_TYPE_INTERVAL_YM, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_INTERVAL_DS, CT_TYPE_INTERVAL_DS, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CHAR, CT_TYPE_ARRAY, CT_TYPE_ARRAY, CT_FALSE, CT_FALSE),

    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_INTEGER, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_BIGINT, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_REAL, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_NUMBER, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_NUMBER2, CT_TYPE_NUMBER2, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_DECIMAL, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_CHAR, CT_TYPE_STRING, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_VARCHAR, CT_TYPE_STRING, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_STRING, CT_TYPE_STRING, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_BINARY, CT_TYPE_BINARY, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_VARBINARY, CT_TYPE_VARBINARY, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_RAW, CT_TYPE_VARCHAR, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_DATE, CT_TYPE_DATE, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_BOOLEAN, CT_TYPE_BOOLEAN, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_INTERVAL_YM, CT_TYPE_INTERVAL_YM, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_INTERVAL_DS, CT_TYPE_INTERVAL_DS, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_VARCHAR, CT_TYPE_ARRAY, CT_TYPE_ARRAY, CT_FALSE, CT_FALSE),

    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_UINT32, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_INTEGER, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_BIGINT, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_REAL, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_NUMBER, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_NUMBER2, CT_TYPE_NUMBER2, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_DECIMAL, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_CHAR, CT_TYPE_STRING, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_VARCHAR, CT_TYPE_STRING, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_STRING, CT_TYPE_STRING, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_BINARY, CT_TYPE_BINARY, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_VARBINARY, CT_TYPE_VARBINARY, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_RAW, CT_TYPE_STRING, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_DATE, CT_TYPE_DATE, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_BOOLEAN, CT_TYPE_BOOLEAN, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_INTERVAL_YM, CT_TYPE_INTERVAL_YM, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_INTERVAL_DS, CT_TYPE_INTERVAL_DS, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_STRING, CT_TYPE_ARRAY, CT_TYPE_ARRAY, CT_FALSE, CT_FALSE),

    __CMP_TYPE_DEF(CT_TYPE_BINARY, CT_TYPE_CHAR, CT_TYPE_BINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BINARY, CT_TYPE_VARCHAR, CT_TYPE_BINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BINARY, CT_TYPE_STRING, CT_TYPE_BINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BINARY, CT_TYPE_BINARY, CT_TYPE_BINARY, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BINARY, CT_TYPE_VARBINARY, CT_TYPE_VARBINARY, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BINARY, CT_TYPE_RAW, CT_TYPE_BINARY, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_RAW, CT_TYPE_CHAR, CT_TYPE_STRING, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_RAW, CT_TYPE_VARCHAR, CT_TYPE_VARCHAR, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_RAW, CT_TYPE_STRING, CT_TYPE_STRING, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_RAW, CT_TYPE_RAW, CT_TYPE_RAW, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_RAW, CT_TYPE_BINARY, CT_TYPE_BINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_RAW, CT_TYPE_VARBINARY, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_BLOB, CT_TYPE_CHAR, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BLOB, CT_TYPE_VARCHAR, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BLOB, CT_TYPE_STRING, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BLOB, CT_TYPE_BINARY, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BLOB, CT_TYPE_RAW, CT_TYPE_RAW, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BLOB, CT_TYPE_VARBINARY, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_BLOB, CT_TYPE_BLOB, CT_TYPE_VARBINARY, CT_TRUE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_UINT32, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_INTEGER, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_BIGINT, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_REAL, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_NUMBER, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_NUMBER2, CT_TYPE_NUMBER2, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_DECIMAL, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_CHAR, CT_TYPE_STRING, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_VARCHAR, CT_TYPE_STRING, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_STRING, CT_TYPE_STRING, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_BINARY, CT_TYPE_BINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_VARBINARY, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_RAW, CT_TYPE_STRING, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_DATE, CT_TYPE_DATE, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_BOOLEAN, CT_TYPE_BOOLEAN, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_INTERVAL_YM, CT_TYPE_INTERVAL_YM, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_INTERVAL_DS, CT_TYPE_INTERVAL_DS, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_CLOB, CT_TYPE_STRING, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_CLOB, CT_TYPE_IMAGE, CT_TYPE_STRING, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_UINT32, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_INTEGER, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_BIGINT, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_REAL, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_NUMBER, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_NUMBER2, CT_TYPE_NUMBER2, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_DECIMAL, CT_TYPE_NUMBER, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_CHAR, CT_TYPE_STRING, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_VARCHAR, CT_TYPE_STRING, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_STRING, CT_TYPE_STRING, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_BINARY, CT_TYPE_BINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_VARBINARY, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_RAW, CT_TYPE_RAW, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_DATE, CT_TYPE_DATE, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_BOOLEAN, CT_TYPE_BOOLEAN, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_INTERVAL_YM, CT_TYPE_INTERVAL_YM, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_INTERVAL_DS, CT_TYPE_INTERVAL_DS, CT_FALSE, CT_FALSE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_CLOB, CT_TYPE_STRING, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_IMAGE, CT_TYPE_IMAGE, CT_TYPE_STRING, CT_TRUE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_VARBINARY, CT_TYPE_CHAR, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_VARBINARY, CT_TYPE_VARCHAR, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_VARBINARY, CT_TYPE_STRING, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_VARBINARY, CT_TYPE_BINARY, CT_TYPE_VARBINARY, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_VARBINARY, CT_TYPE_VARBINARY, CT_TYPE_VARBINARY, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_VARBINARY, CT_TYPE_RAW, CT_TYPE_VARBINARY, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_DATE, CT_TYPE_CHAR, CT_TYPE_DATE, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DATE, CT_TYPE_VARCHAR, CT_TYPE_DATE, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DATE, CT_TYPE_STRING, CT_TYPE_DATE, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DATE, CT_TYPE_DATE, CT_TYPE_DATE, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DATE, CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DATE, CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DATE, CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_DATE, CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP, CT_TYPE_CHAR, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP, CT_TYPE_VARCHAR, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP, CT_TYPE_STRING, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP, CT_TYPE_DATE, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_CHAR, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_VARCHAR, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_STRING, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_DATE, CT_TYPE_TIMESTAMP, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ, CT_TYPE_CHAR, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ, CT_TYPE_VARCHAR, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ, CT_TYPE_STRING, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ, CT_TYPE_DATE, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_TRUE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_CHAR, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_VARCHAR, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_STRING, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_DATE, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_TZ_FAKE, CT_TYPE_TIMESTAMP_LTZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_TZ, CT_TYPE_TIMESTAMP_TZ, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_LTZ, CT_TYPE_TIMESTAMP_LTZ, CT_TRUE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_INTERVAL_YM, CT_TYPE_CHAR, CT_TYPE_INTERVAL_YM, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTERVAL_YM, CT_TYPE_VARCHAR, CT_TYPE_INTERVAL_YM, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTERVAL_YM, CT_TYPE_STRING, CT_TYPE_INTERVAL_YM, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTERVAL_YM, CT_TYPE_INTERVAL_YM, CT_TYPE_INTERVAL_YM, CT_TRUE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_INTERVAL_DS, CT_TYPE_CHAR, CT_TYPE_INTERVAL_DS, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTERVAL_DS, CT_TYPE_VARCHAR, CT_TYPE_INTERVAL_DS, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTERVAL_DS, CT_TYPE_STRING, CT_TYPE_INTERVAL_DS, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_INTERVAL_DS, CT_TYPE_INTERVAL_DS, CT_TYPE_INTERVAL_DS, CT_TRUE, CT_TRUE),

    __CMP_TYPE_DEF(CT_TYPE_ARRAY, CT_TYPE_STRING, CT_TYPE_ARRAY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_ARRAY, CT_TYPE_CHAR, CT_TYPE_ARRAY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_ARRAY, CT_TYPE_VARCHAR, CT_TYPE_ARRAY, CT_FALSE, CT_TRUE),
    __CMP_TYPE_DEF(CT_TYPE_ARRAY, CT_TYPE_ARRAY, CT_TYPE_ARRAY, CT_TRUE, CT_TRUE),
};   // end g_cmp_rules

status_t var_like(variant_t *left, variant_t *right, bool32 *result, bool32 has_escape, char escape,
    charset_type_t type)
{
    text_t *l_text = NULL;
    text_t *r_text = NULL;

    l_text = VALUE_PTR(text_t, left);
    r_text = VALUE_PTR(text_t, right);

    if (has_escape) {
        int32 cmp_ret = 0;
        CT_RETURN_IFERR(CM_CHARSET_FUNC(type).escape_like(l_text->str, l_text->str + l_text->len,
            r_text->str, r_text->str + r_text->len, escape, &cmp_ret));
        *result = (cmp_ret == 0);
        return CT_SUCCESS;
    }
    *result = CM_CHARSET_FUNC(type).like(l_text, r_text);
    return CT_SUCCESS;
}

static status_t var_compare_diff_type(const nlsparams_t *nls,
    variant_t *left, variant_t *right, int32 *result)
{
    char       buf[CT_STRING_BUFFER_SIZE];
    text_buf_t convert_buf;
    variant_t  l_var, r_var;

    ct_type_t  cmp_type = get_cmp_datatype(left->type, right->type);
    if (cmp_type == INVALID_CMP_DATATYPE) {
        CT_SET_ERROR_MISMATCH(left->type, right->type);
        return CT_ERROR;
    }

    CM_INIT_TEXTBUF(&convert_buf, CT_STRING_BUFFER_SIZE, buf);
    var_copy(left, &l_var);
    var_copy(right, &r_var);

    // !!!only one variant need use converting buffer
    CT_RETURN_IFERR(var_convert(nls, &l_var, cmp_type, &convert_buf));
    CT_RETURN_IFERR(var_convert(nls, &r_var, cmp_type, &convert_buf));

    return var_compare_same_type(&l_var, &r_var, result);
}

status_t var_compare(const nlsparams_t *nls, variant_t *left, variant_t *right, int32 *result)
{
    if (left->is_null) {
        *result = 1;
        return CT_SUCCESS;
    } else if (right->is_null) {
        *result = -1;
        return CT_SUCCESS;
    }
    
    if (SECUREC_UNLIKELY(CT_IS_UNKNOWN_TYPE(left->type) || CT_IS_UNKNOWN_TYPE(right->type))) {
        CT_THROW_ERROR(ERR_INVALID_DATA_TYPE, "comparision");
        return CT_ERROR;
    }

    if (left->type == right->type || get_cmp_rule(left->type, right->type)->same_type) {
        return var_compare_same_type(left, right, result);
    }

    return var_compare_diff_type(nls, left, right, result);
}

bool32 var_const_equal(const variant_t *v1, const variant_t *v2)
{
    if (v1->type != v2->type || v1->is_null != v2->is_null) {
        return CT_FALSE;
    } else if (v1->is_null == CT_TRUE && v2->is_null == CT_TRUE) {
        return CT_TRUE;
    }

    switch (v1->type) {
        case CT_TYPE_UINT32:
        case CT_TYPE_INTEGER:
        case CT_TYPE_INTERVAL_YM:
            return (v1->v_int == v2->v_int);

        case CT_TYPE_BIGINT:
        case CT_TYPE_INTERVAL_DS:
            return (v1->v_bigint == v2->v_bigint);

        case CT_TYPE_REAL:
            return (fabs(v1->v_real - v2->v_real) < CT_REAL_PRECISION);

        case CT_TYPE_NUMBER:
        case CT_TYPE_DECIMAL:
        case CT_TYPE_NUMBER2:
            return (cm_dec_cmp(&v1->v_dec, &v2->v_dec) == 0);

        case CT_TYPE_DATE:
        case CT_TYPE_TIMESTAMP_TZ_FAKE:
        case CT_TYPE_TIMESTAMP_LTZ:
        case CT_TYPE_INTERVAL:
            return (v1->v_date == v2->v_date);

        case CT_TYPE_TIMESTAMP_TZ:
            return (cm_tstz_cmp(VALUE_PTR(timestamp_tz_t, v1), VALUE_PTR(timestamp_tz_t, v2)) == 0);

        case CT_TYPE_TIMESTAMP:
            return (v1->v_tstamp == v2->v_tstamp);

        case CT_TYPE_CHAR:
        case CT_TYPE_VARCHAR:
        case CT_TYPE_STRING:
            return cm_text_equal(&v1->v_text, &v2->v_text);

        case CT_TYPE_BOOLEAN:
            return (v1->v_bool == v2->v_bool);

        case CT_TYPE_TYPMODE:
            return (memcmp(&v1->v_type, &v2->v_type, sizeof(typmode_t)) == 0);

        case CT_TYPE_ITVL_UNIT:
            return (v1->v_itvl_unit_id == v2->v_itvl_unit_id);

        default:
            return CT_FALSE;
    }
}

bool32 var_seq_equal(const var_seq_t *v1, const var_seq_t *v2)
{
    if (cm_text_equal_ins(&v1->user, &v2->user) && cm_text_equal(&v1->name, &v2->name) && v1->mode == v2->mode) {
        return CT_TRUE;
    }
    return CT_FALSE;
}
